local UnitlModule = require("Lua.UnitlModule");

--#region 第八节 表-字典篇

UnitlModule.PrintTimer();

UnitlModule.PrintOperaName("字典的声明");

local dict = {
             ["name"] = "王富贵",
             ["age"] = 18,
             [true] = false,
             [false] = true
             };

--访问单个变量，和字典一样
print(dict["name"]);
print(dict["age"]);
print(dict[true]);
print(dict[false]);
--这种访问也行，但是不能是数字或者关键字
print(dict.name);
print(dict.age);
--修改
dict["name"] = "齐海彬";
print(dict.name);
--新增
dict["sex"] = 666;
print(dict.sex);
--删除
dict["sex"] = nil;
print(dict.sex);

UnitlModule.PrintOperaName("字典遍历");
--只能用pairs，不能用ipairs
for k,v in pairs(dict) do 
    --可以传多个参数，依旧能打印出来
    print(k,v,99,88);
end
--好像优先遍历关键字？
--#endregion

--#region 第九节 表-类和结构体篇
UnitlModule.PrintTimer();
UnitlModule.PrintOperaName("类的声明");

Person = {
        name = "张三";

        age = 18;

        Study = function ()
            --print(name); 这样不行，这个name和表中的name没有任何关系
            --是一个全局变量

            print(Person.name.."学习中"); --这样才行，要指定是谁的
        end;

        --这样也行
        Smile = function (who)
            print(who.name.."笑了");
        end;

        newDict = {
                  ["👉"] = "齐海彬",
                  ["👈"] = "孔德才",
                  ["👆"] = "鲍怀铮",
                  ["👇"] = "张钦寓"
        };

        
};

--表外类属性和方法的声明
Person.sex = "男";
Person.Up = function ()
    print("成长！");
end

--第三种声明方法的方法
function  Person.GetItem()
    print("获取物品!");
end

--第四种声明方法的方法
function Person:Smile_2()
    --lua中有一个关键字self，表示默认传入的第一个参数
    print(self.name.."正在😀");
end


function Person:Foreach()
        for k,v in pairs(self.newDict) do
        print(k,v);    
        end
end

--[[
    C#要是使用类，实例化对象new，静态直接.
    Lua中类的表现，更像是一个类中有很多静态变量和函数
--]]
print(Person.name);
Person.Study();
print(Person.sex);
Person.Up();

--要这样调用
Person.Smile(Person);
--或者这样调用 {类名}:{方法} 调用会默认把调用者作为第一个参数传入方法中
Person:Smile();

Person:Smile_2();
Person.Smile_2(Person);

Person:Foreach();
--#endregion

--#region 第十节 表-公共操作
UnitlModule.PrintTimer ();
UnitlModule.PrintOperaName("表的公共操作");

function ForeachTable(input_t)
    if type(input_t) ~= type(table) then
        print("Type ERR");
        return ;
    end;

    for k,v in pairs(input_t) do
        print(k,v);
    end

end

UnitlModule.PrintOperaName("插入");
table_1 = {
            {name = "张三",age = 18,sex = "男"},
            {name = "李四",age = 16,sex = "女"}
};

table_2 = {name = "王五",age = 22,sex = "男"};

table.insert(table_1,table_2);
ForeachTable(table_1[1]);
ForeachTable(table_1[2]);
ForeachTable(table_1[3]);



UnitlModule.PrintOperaName("删除");
--未指定移除位置
table.remove(table_1);
ForeachTable(table_1[1]);
ForeachTable(table_1[2]);
ForeachTable(table_1[3]);


--指定移除位置
table.remove(table_1,1);
ForeachTable(table_1[1]);

--如果没有指定位置，会从最后一位开始删除

UnitlModule.PrintOperaName("排序");

array = {9,5,3,7,6,4,1};

--正排序
table.sort(array);
ForeachTable(array);
UnitlModule.NextLine();

--倒排序
table.sort(array,function (a,b)
        return a > b;
end);
ForeachTable(array);


UnitlModule.PrintOperaName("拼接");
tb = {"123","456","789"};

--返回值是string，第二个空可以自定义连接符号
str = table.concat(tb,",");
print(str);
--#endregion

